1、动态内存管理
	分配内存
	kmalloc             //申请指定大小的内存，内存在物理地址上连续
	__get_free_pages    //申请2的n次方页内存，内存在物理地址上连续
	__get_free_page     //申请一页内存，内存在物理地址上连续
	vmalloc             //申请指定大小的内存，内存在物理地址上不连续，但此函数相对于上面3个函数可以申请更大的内存空间
	释放内存
	kfree               //释放内存，与kmalloc配合使用
	free_pages          //释放内存，与__get_free_pages配合使用
	free_page           //释放内存，与__get_free_page配合使用
	vfree               //释放内存，与vmalloc配合使用
	内存分配掩码
	GFP_ATOMIC 以原子方式分配内存，内存分配过程不会引起进程切换
	GFP_KERNEL 常规方式内存
	GFP_USER 为用户空间分配，也需要内核空间能访问，常被映射到用户空间
	GFP_DMA 在ZONE_DMA区域分配内存，要求分配的内存能进行DMA映射
2、I/O内存
	request_mem_region //申请I/O内存资源，同一段I/O内存只能被申请一次，未申请的I/O内存也能进行I/O映射，但是无法确保映射的唯一性
	release_mem_region //释放I/O内存资源
	ioremap            //将I/O内存映射到虚拟地址
	iounmap            //取消ioremap的映射
	//不建议直接操作映射后的IO内存地址，应通过下列函数完成
	readb              //读8位
	readw              //读16位
	readl              //读32位
	writeb             //写8位
	writew             //写16位
	writel             //写32位
	ioread8            //读8位
	ioread16           //读16位
	ioread32           //读32位
	iowrite8           //写8位
	iowrite16          //写16位
	iowrite32          //写32位
	ioread8_rep        //按8位为单位连续读
	ioread16_rep       //按16位为单位连续读
	ioread32_rep       //按32位为单位连续读
	iowrite8_rep       //按8位为单位连续写
	iowrite16_rep      //按16位为单位连续写
	iowrite32_rep      //按32位为单位连续写
3、链表
	链表数据结构：
	struct list_head
	{
		struct list_head * prev;
		struct list_head * next;
	};
	LIST_HEAD				//静态定义并初始化一个链表头
	list_add_head			//在链表头插入
	list_add_tail			//在链表尾插入
	list_del				//删除链表节点
	list_empty				//链表是否为空
	list_for_each_safe		//遍历链表
	container_of			//根据对象成员地址、成员名称和对象数据类型查找对象地址
4、数据拷贝
	内核层和应用层完全隔离，内核层不能直接访问用户层的地址，用户层也不能访问内核层的地址
	copy_from_user			//将应用层的数据拷贝到内核层，成功返回0，失败则返回未拷贝的字节数
	copy_to_user			//将内核层的数据拷贝到应用层，成功返回0，失败则返回未拷贝的字节数
